﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Technical
{
    /// <summary>
    /// Klassen är till för att spara, hantera och skapa kundrader i databasen.
    /// </summary>
    class KundPercistance
    {
        private LinqToSQLDataContext database;
        private bool successfull = false;
        private string pass = AccessController.Instance.Connection;

        //Beroende på värdet i isNew skapar eller uppdaterar SaveKund en kund
        public bool SaveKund(Kundregister kundObject, bool isNew)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                var nykund = from Kundregister in database.Kundregisters
                             where Kundregister.kundNamn == kundObject.kundNamn
                             select Kundregister.kundNamn;

                if (!nykund.Contains(kundObject.kundNamn) && isNew == true)
                {
                    successfull = Kundregistrering(kundObject);
                }
                else if (nykund.Contains(kundObject.kundNamn) && isNew == false)
                {
                    successfull = UpdateKundregister(kundObject);
                }

                database.Connection.Close();
                return successfull;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Skapar en ny kund i databasen av objektet kundObject
        private bool Kundregistrering(Kundregister kundObject)
        {
            try
            {
                database.Kundregisters.InsertOnSubmit(kundObject);
                database.SubmitChanges();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Uppdaterar kundregistret där kundObject överensstämmer med en rad i databasen
        private bool UpdateKundregister(Kundregister kundObject)
        {
            try
            {
                Kundregister uppdateraKund = database.Kundregisters.Single(k => k.kundID == kundObject.kundID);

                //uppdateraKund.kundkategori = kundObject.kundkategori;
                //uppdateraKund.kundNamn = kundObject.kundNamn;
                //uppdateraKund.kontaktFnamn = kundObject.kontaktFnamn;
                //uppdateraKund.kontaktEnamn = kundObject.kontaktEnamn;
                //uppdateraKund.email = kundObject.email;
                //uppdateraKund.telefonnummer = kundObject.telefonnummer;
                //uppdateraKund.signatur = kundObject.signatur;
                //uppdateraKund.andratDatum = kundObject.andratDatum;

                uppdateraKund = kundObject;

                database.SubmitChanges();
                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Returnerar kunder som stämmer överens med inparametrar
        public IEnumerable<Kundregister> GetKund(string kundkategori, string kundnamn, string kundid)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                IEnumerable<Kundregister> kunder = from Kund in database.Kundregisters
                                                   where (Kund.kundkategori.Contains(kundkategori))
                                                   && (Kund.kundNamn.Contains(kundnamn))
                                                   && (Kund.kundID.Contains(kundid))
                                                   select Kund;

                database.Connection.Close();
                return kunder.ToList();
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public IEnumerable<Kundregister> getFiltreringskriterier()
        {
            try
            {
                database = new LinqToSQLDataContext(pass);
                //List<Kundregister> kundlista = new List<Kundregister>();

                IEnumerable<Kundregister> kunder = from Kundregister in database.Kundregisters
                                                   select Kundregister;

                //foreach (Kundregister kR in kunder)
                //{
                //    Kund nyKund = new Kund();
                //    nyKund.KundID = kR.kundID;
                //    nyKund.KundNamn = kR.kundNamn;
                //    nyKund.Kundkategori = kR.kundkategori;
                //    kundlista.Add(nyKund);
                //}

                database.Connection.Close();
                return kunder;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        //Intäktsbudgeteringar på kunder hela vägen ner
        public IEnumerable<Kundregister> RetrieveCustomersOnBudgets(string kundOmrade)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);
                //List<Kund> kundlista = new List<Kund>();

                IEnumerable<Kundregister> kunder = from Kundregister in database.Kundregisters
                                                   join Intäktsbudget in database.Intäktsbudgetregisters on Kundregister.kundID equals Intäktsbudget.kundID
                                                   where Kundregister.kundkategori.Contains(kundOmrade)
                                                   select Kundregister;

                //foreach (Kundregister kR in kunder)
                //{
                //    Kund nyKund = new Kund();
                //    nyKund.KundID = kR.kundID;
                //    nyKund.KundNamn = kR.kundNamn;
                //    nyKund.Kundkategori = kR.kundkategori;
                //    kundlista.Add(nyKund);
                //}

                database.Connection.Close();
                return kunder;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        //Intäktsbudgetering metod för att hämta budgeteringar
        public List<Intäktsbudget> RetrieveAllCustomerBudgets(string kundid, string produkt, string prodkategori, string gradA, string gradT)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                IEnumerable<Intäktsbudgetregister> budgets = from Intäktsbudgetregisters in database.Intäktsbudgetregisters
                                                             join Produkt in database.Produktregisters on Intäktsbudgetregisters.produktID equals Produkt.produktID
                                                             where Intäktsbudgetregisters.kundID == kundid && Produkt.produkt.Contains(produkt) && Produkt.Produktkategori.produktKategoriNamn.Contains(prodkategori)
                                                             && Intäktsbudgetregisters.gradA.StartsWith(gradA) && Intäktsbudgetregisters.gradT.StartsWith(gradT)
                                                             select Intäktsbudgetregisters;


                List<Intäktsbudget> intaktsBudgets = new List<Intäktsbudget>();
                foreach (Intäktsbudgetregister iB in budgets)
                {
                    Intäktsbudget nyIB = new Intäktsbudget();
                    nyIB.IntäktsbudgetID = iB.intBudID;
                    nyIB.ProdID = iB.produktID;
                    nyIB.ProduktNamn = iB.Produktregister.produkt;
                    nyIB.Avtal = iB.avtal;
                    nyIB.GradAvtal = iB.gradA;
                    nyIB.Tillägg = iB.tillagg;
                    nyIB.GradTillägg = iB.gradT;
                    nyIB.Kommentar = iB.kommentar;
                    nyIB.KundID = iB.kundID;
                    nyIB.Timmar = iB.tim;
                    nyIB.Låst = iB.låst;
                    nyIB.Datum = iB.andratDatum;
                    nyIB.Signatur = iB.signatur;
                    intaktsBudgets.Add(nyIB);
                }

                database.Connection.Close();
                return intaktsBudgets;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        //hämta lista av produkter för en kund
        public IEnumerable<Produktregister> RetrieveFilterBudgets(string kundid)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                IEnumerable<Produktregister> produkter = from Produktregister in database.Produktregisters
                                                         join Intäktsbudget in database.Intäktsbudgetregisters on Produktregister.produktID equals Intäktsbudget.produktID
                                                         join Produktkategori in database.Produktkategoris on Produktregister.produktKategoriID equals Produktkategori.produktKategoriID
                                                         join Produktgrupp in database.Produktgrupps on Produktregister.produktGruppID equals Produktgrupp.produktGruppID
                                                         where Intäktsbudget.kundID == kundid
                                                         select Produktregister;
                //select new { Produkt.produktID, Produkt.produkt, Produkt.Produktgrupp.produktGruppNamn, Produktkategori.produktKategoriNamn, Produkt.avdelningsnamn };

                //List<Produkt> prodlista = produkter.AsEnumerable()
                //                .Select(p => new Produkt
                //                {
                //                    ProduktID = p.produktID,
                //                    ProduktNamn = p.produkt,
                //                    ProduktGrupp = p.produktGruppNamn,
                //                    ProduktKategori = p.produktKategoriNamn,
                //                    Produktionsomrade = p.avdelningsnamn,
                //                }).ToList();

                database.Connection.Close();
                return produkter;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        //Uppdaterar intäktsbudgerering
        public bool UpdateCustomerBudgetRow(Intäktsbudgetregister budgetObject)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);
                Intäktsbudgetregister UpdateCustomerBudget = database.Intäktsbudgetregisters.Single(i => i.intBudID == budgetObject.intBudID);

                UpdateCustomerBudget.gradA = budgetObject.gradA;
                UpdateCustomerBudget.gradT = budgetObject.gradT;
                UpdateCustomerBudget.kommentar = budgetObject.kommentar;
                UpdateCustomerBudget.andratDatum = (DateTime?)DateTime.Now;
                UpdateCustomerBudget.tim = budgetObject.tim;
                UpdateCustomerBudget.avtal = budgetObject.avtal;
                UpdateCustomerBudget.signatur = budgetObject.signatur;
                UpdateCustomerBudget.tillagg = budgetObject.tillagg;

                database.SubmitChanges();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Skapar ny intäktsbudgetering
        public bool InsertNewBudgetRow(Intäktsbudgetregister budgetObject)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                Intäktsbudgetregister newBudgetRow = new Intäktsbudgetregister
                {
                    andratDatum = budgetObject.andratDatum,
                    avtal = budgetObject.avtal,
                    gradA = budgetObject.gradA,
                    gradT = budgetObject.gradT,
                    kommentar = budgetObject.kommentar,
                    kundID = budgetObject.kundID,
                    produktID = budgetObject.produktID,
                    signatur = budgetObject.signatur,
                    tillagg = budgetObject.tillagg,
                    tim = budgetObject.tim,
                    avserÅr = budgetObject.andratDatum
                };
                database.Intäktsbudgetregisters.InsertOnSubmit(newBudgetRow);
                database.SubmitChanges();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Tar bort en intäktsbugetering
        public bool RemoveBudgetFromCustomer(int budgID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                Intäktsbudgetregister budgToBeRemoved = database.Intäktsbudgetregisters.Single(iBR => iBR.intBudID == budgID);
                database.Intäktsbudgetregisters.DeleteOnSubmit(budgToBeRemoved);
                database.SubmitChanges();

                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }
        //Check kund existerar
        public bool ValidateIfCustomerExists(string kundid, string kundnamn)
        {
            try
            {
                successfull = false;
                database = new LinqToSQLDataContext(pass);
                if (database.Kundregisters.Any(k => k.kundID == kundid && k.kundNamn == kundnamn))
                {
                    successfull = true;
                }
                return successfull;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }
    }
}
